<?php
class Student
{
     /* 定义属性，属性私有化 */
     private $id;
     private $name;
     private $birth;
     private $gender;

     /**
      * 选课集合
      *
      * @var Course
      */
     private $coursesSelection = [];

     /**
      * 构造函数
      */
     public function __construct($id, $name, $age, $gender)
     {
     	  $this->setId($id);
     	  $this->setName($name);
     	  $this->setAge($age);
     	  $this->setGender($gender);
     }

     /**
      * 增加选课
      *
      * @param $course Course 要选的课程对象实例
      */
     public function addCourse(Course $course)
     {
          $this->coursesSelection[] = $course;
     }

     /**
      * 删除指定id的课程
      *
      * @param $courseId 要删除的课程id
      */
     public function removeCourse($courseId)
     {
          $index = -1;
          for ($i = 0; $i < count($this->coursesSelection); $i++) {
               if ($this->coursesSelection[$i]->id == $courseId) {
                    $index = $i;
                    break;
               }
          }
          if ($index > -1) {
               array_splice($this->coursesSelection, $index, 1);
          }
     }

     public function study()
     {
           echo $this->name . '将要学习以下课程: <br/>';
           foreach ($this->coursesSelection as $course) {
                echo $course;
           }
           echo '<br/>';
     }

     public function sleep()
     {
     	    echo $this->name . '困了，要睡觉了</br>';
     }

     /* 魔术方法：属性读取器 ,$name 为属性名 */
     public function __get($name)
     {
          $method = 'get' . ucfirst(strtolower($name));
          // 判断方法名为$method的方法是否存在
          if (method_exists($this, $method)) {
               return $this->$method();
          }
          echo '方法 ' . $method . ' 不存在';
          return null;
     }

     /* 魔术方法: 属性赋值器， $name为属性名，$value为属性值 */ 
     public function __set($name, $value)
     {
          $method = 'set' . ucfirst(strtolower($name));
          // 判断方法名为$method的方法是否存在
          if (method_exists($this, $method)) {
               $this->$method($value);
          }
     }

     /* 封装对于私有数据的读取和写入 */
     
     private function getId()
     {
     	    return $this->id;
     }

     private function setId($id)
     {
     	    if (is_integer($id) && $id > 0) {
     	        $this->id = $id;
     	    } else {
     	        echo 'id不合法';
     	    }
     }

     private function getName()
     {
     	    return $this->name;
     }

     private function setName($name)
     {
     	    if (is_string($name)) {
     	        $this->name = $name;
     	    }
     }

     private function getAge()
     {
       	return '生于 ' . date('Y', $this->birth) . ' 年';
     }

     private function setAge($age)
     {
     	    if (is_integer($age)) {
     	        $this->birth = time() - $age * 365 * 24 * 3600;
          }
     }

     private function getGender() 
     {
     	    return $this->gender == 1 ? '男' : '女';
     }

     private function setGender($gender)
     {
     	    if (is_integer($gender)) {
     	        $this->gender = $gender;
     	    }
     }
}